/*
小朋友 A 在和 ta 的小伙伴们玩传信息游戏，游戏规则如下：

有 n 名玩家，所有玩家编号分别为 0 ～ n-1，其中小朋友 A 的编号为 0
每个玩家都有固定的若干个可传信息的其他玩家（也可能没有）。传信息的关系是单向的（比如 A 可以向 B 传信息，但 B 不能向 A 传信息）。
每轮信息必须需要传递给另一个人，且信息可重复经过同一个人
给定总玩家数 n，以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数；若不能到达，返回 0。


输入：n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3

输出：3

解释：信息从小 A 编号 0 处开始，经 3 轮传递，到达编号 4。共有 3 种方案，分别是 0->2->0->4， 0->2->1->4， 0->2->3->4。


输入：n = 3, relation = [[0,2],[2,1]], k = 2

输出：0

解释：信息不能从小 A 处经过 2 轮传递到编号 2
*/

#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
    int numWays(int n, vector<vector<int>>& relation, int k) {
        vector<vector<int>> dp(k+1,vector<int>(n));
		dp[0][0]=1;
		for(int i=1;i<=k;i++){
			for(int j=0;j<relation.size();j++){
                //从a传到b [a,b]
				int a=relation[j][0],b=relation[j][1];
				dp[i][b]+=dp[i-1][a];
			}
		} 
		return dp[k][n-1];
    }
};

/*
dp[i][j] 为经过 i 轮传递到编号 j 的玩家的方案数
由于从编号 0 的玩家开始传递，当 i=0 时，一定位于编号 0 的玩家，不会传递到其他玩家，所以dp[0][0]=1
dp[i][j]的答案就是：所有点里面能够到达j点的和
return dp[k][n-1];  最后返回的是 k 轮循环后到达 n-1 位置的值
*/